#pragma once

#include <cstdint>
#include "event_object.hh"
#include "../time_util.hh"

namespace kratos { namespace corelib {

enum class ReserveEvent : std::uint32_t {
    ///////////////////////////////////////////////////////////////////////////
    // core
    ///////////////////////////////////////////////////////////////////////////
    EVENT_ID_HALT = 1,

    ///////////////////////////////////////////////////////////////////////////
    // Time Utility
    ///////////////////////////////////////////////////////////////////////////
    EVENT_ID_TIME_MINUTE_CHANGE,
    EVENT_ID_TIME_HOUR_CHANGE,
    EVENT_ID_TIME_DAY_CHANGE,
    EVENT_ID_TIME_WEEK_CHANGE,
    EVENT_ID_TIME_MONTH_CHANGE,
    EVENT_ID_TIME_YEAR_CHANGE,

    ///////////////////////////////////////////////////////////////////////////
    // Timer 
    ///////////////////////////////////////////////////////////////////////////
    EVENT_ID_TIMER,

    ///////////////////////////////////////////////////////////////////////////
    // The start point of user defined event ID
    ///////////////////////////////////////////////////////////////////////////
    EVENT_ID_USER,
};

// Time event
class EventTime : public EventObject {
public:
    // ctor
    // @param eventID event ID
    EventTime(EventID eventID);
    virtual ~EventTime();
};

// Time event
class EventTimer : public EventObject {
public:
    // ctor
    // @param receiver event receiver ID
    EventTimer(std::uint64_t receiver);
    virtual ~EventTimer();
};

}}
